package com.itheima.mp;

//mp适合单表，多表还要mybatis

//basemapper可自定义sql，有条件构造器，较为灵活
//iservice可直接用方法，不必调用mapper，较为方便
//复杂了还要用mapper层方法
//条件构造器就是构造where条件
//lambda防止死代码,是非空，属性封装
//iservice是非静态的，静态工具是静态的,静态要给泛型不然无法使用
//iservice比mapper强大
//静态工具防止循环依赖,两个service相互调用情况






//大家在日常开发中应该能发现，单表的CRUD功能代码重复度很高，也没有什么难度。而这部分代码量往往比较大，开发起来比较费时。
//
//因此，目前企业中都会使用一些组件来简化或省略单表的CRUD开发工作。目前在国内使用较多的一个组件就是MybatisPlus.


//2.1.条件构造器
//除了新增以外，修改、删除、查询的SQL语句都需要指定where条件
// 。因此BaseMapper中提供的相关方法除了以id作为where条件以外，还支持更加复杂的where条件。
//Wrapper的子类AbstractWrapper提供了where中包含的所有条件构造方法：
//而QueryWrapper在AbstractWrapper的基础上拓展了一个select方法，允许指定查询字段：
//而UpdateWrapper在AbstractWrapper的基础上拓展了一个set方法，允许指定SQL中的SET部分：

//2.1.3.LambdaQueryWrapper
//无论是QueryWrapper还是UpdateWrapper在构造条件的时候都需要写死字段名称，会出现字符串魔法值。这在编程规范中显然是不推荐的。
//那怎么样才能不写字段名，又能知道字段名呢？
//
//其中一种办法是基于变量的gettter方法结合反射技术。因此我们只要将条件对应的字段的getter方法传递给MybatisPlus，它就能计算出对应的变量名了。而传递方法可以使用JDK8中的方法引用和Lambda表达式。
//因此MybatisPlus又提供了一套基于Lambda的Wrapper，包含两个：
//- LambdaQueryWrapper
//- LambdaUpdateWrapper
//分别对应QueryWrapper和UpdateWrapper

//理论上来讲MyBatisPlus是不支持多表查询的，不过我们可以利用Wrapper中自定义条件结合自定义SQL来实现多表查询的效果。
//例如，我们要查询出所有收货地址在北京的并且用户id在1、2、4之中的用户
//要是自己基于mybatis实现SQL，大概是这样的：

//由于Service中经常需要定义与业务有关的自定义方法，因此我们不能直接使用IService，而是自定义Service接口，然后继承IService以拓展方法。同时，让自定义的Service实现类继承ServiceImpl，这样就不用自己实现IService中的接口了。
//首先，定义IUserService，继承IService：

//IService中还提供了Lambda功能来简化我们的复杂查询及更新功能。我们通过两个案例来学习一下。
//
//案例一：实现一个根据复杂条件查询用户的接口，查询条件如下：
//- name：用户名关键字，可以为空
//- status：用户状态，可以为空
//- minBalance：最小余额，可以为空
//- maxBalance：最大余额，可以为空
//可以理解成一个用户的后台管理界面，管理员可以自己选择条件来筛选用户，因此上述条件不一定存在，需要做判断。